﻿using Busconeitor.BusinessLayer.Util;

namespace Busconeitor.BusinessLayer.Utils
{
    using System;
    using System.IO;
    using Domain.Utils.HashTable;
    using log4net;

    public class StopWords
    {
        #region Atributos
        
        private const string StopwordsNombreArchivo = "H:\\Facultad\\DLC\\DLC_-_SEARCH\\config\\stopwords.txt";
        // Instancia a devolver
        private static StopWords INSTANCE = new StopWords();
        // Tabla hash que contiene a las stopwords
        private HashTable stopWords; 

        #endregion

        #region Constructores

        private StopWords()
        {
            //stopWords = new HashTable(500);
            //CargarTabla();
            CargarStopWords();
        }

        #endregion

        #region Propiedades

        #endregion
        
        #region Metodos

        /// <summary>
        /// Determina si un termino es o no una stop word, se utiliza en el searchengine para comprobar 
        /// que la cadena de busqueda no contenga stop words.
        /// </summary>
        /// <param name="pWord">palabra a analizar.</param>
        /// <returns>booleano que sera true en caso de ser una stop word y false en caso contrario.</returns>                  
        public static Boolean EsStopWord(String pWord)
        {
            return TratamientoTexto.EsPalabraVacia(pWord);
            //return INSTANCE.ExisteStopWord(pWord);
        }

        private Boolean ExisteStopWord(String pWord)
        {
            return stopWords.Contains(pWord);
        }

        /// <summary>
        /// Carga la tabla hash con las stop words.
        /// </summary>
        private void CargarTabla()
        {
            try
            {
                var buffer = new StreamReader(StopwordsNombreArchivo);
                String palabraAux;

                while ((palabraAux = buffer.ReadLine()) != null)
                {
                    palabraAux = WordCleaner.CleanWord(palabraAux);

                    if (palabraAux.Length > 0 && !stopWords.Contains(palabraAux))
                    {
                        stopWords.Put(palabraAux);
                    }
                }

                buffer.Close();
            }
            catch (FileNotFoundException ex)
            {
                var logger = LogManager.GetLogger("CargarTabla");
                logger.Error(ex.ToString());
                throw ex;
            }
            catch (IOException ex)
            {
                var logger = LogManager.GetLogger("CargarTabla");
                logger.Error(ex.ToString());
                throw ex;
            }
        }

        private void CargarStopWords()
        {
            TratamientoTexto.RealizarHashPalabrasVacias();
        }

        #endregion
    }
}
